package cn.Util.Number;

/**
 * �����ƹ���
 * @author Lynx
 * @date 2015��4��18��
 */
public class BinaryUtil {
	private BinaryUtil() {
	}

	/**
	 * ��ȡ����
	 * @param binary Ҫ��ת���Ķ�����
	 * @return
	 */
	public static String getOpposit(String binary) {
		char[] binArray = binary.toCharArray();
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < binary.length(); i++) {
			if (binArray[i] == '0') {
				sb.append(1);
			} else {
				sb.append(0);
			}
		}
		return sb.toString();
	}

	// ��ø����ʮ����
	/**
	 * ��ȡ��16
	 * @param binaryString
	 * @return   ���ظ��� ʮ��������
	 */
	public static String getNativeNumber(String binaryString) {
		//System.out.println("Ŀ��� ��:"+binaryString);
		String opposit = getMinusNum(binaryString.length());
		//System.out.println("-1�Ĳ�����:" + opposit);
		String calutor = binaryAdd(binaryString, getMinusNum(binaryString.length()),false);
		//System.out.println("��������:" + calutor);
        String oppo=getOpposit(calutor);
		//System.out.println("�󷴽����:"+getOpposit(calutor));
		char[] num=oppo.toCharArray();
		StringBuffer sb=new StringBuffer();
		for (int i = 1; i < num.length; i++) {
			sb.append(num[i]);
		}
		int result= Integer.parseInt(sb.toString(), 2);
		//System.out.println("result:-" + result);
		return "-"+result;
	}

	/**
	 * �Ӳ����õ�������Ҫ-1�������������-1�Ĳ��� 
	 * @param binaryLength  Ҫ�����������ĳ���
	 * @return
	 */
	private static String getMinusNum(int binaryLength) {
		String minNum = "0";
		for (int i = 0; i < binaryLength - 1; i++) {
			minNum = minNum+"1";
		}
		return minNum;
	}

	// �����Ƽӷ�����
	/**
	 * ��������������ӡ�
	 * @param bnum1  ��һ���������� �ַ�
	 * @param bnum2 �ڶ����������� �ַ�
	 * @param overflow  �Ƿ����������
	 * @return  ������ӽ��
	 */
	private static String binaryAdd(String bnum1, String bnum2, boolean overflow) {
		boolean flag = false;
		char[] bb1 = bnum1.toCharArray();
		char[] bb2 = bnum2.toCharArray();
		int maxLength = (bb1.length >= bb2.length ? bb1.length : bb2.length);
		StringBuffer result = new StringBuffer();
		for (int i = 0; i < maxLength; i++) {
			// ��һ���Ȳ���ȵ������������� ��ô��
			if (i > bb1.length - 1 || i > bb2.length - 1) {
				//System.out.println("�ַ��Ȳ�һ������");
				throw new AbstractMethodError("���볤�Ȳ���ȵĶ���������ӣ����д�ʵ�֣�");
			}
			if (flag) {
				// ˵����һλ�н�λ
				int temp1 = Integer.parseInt(bb1[bb1.length - i - 1] + "");
				int temp2 = Integer.parseInt(bb2[bb2.length - i - 1] + "");
				// ��Ϊ�ϴ��н�λ������������ʱ�� Ҫ��1 ���õ��Ľ������flag �õ�����Ƿ��н�λ
				flag = (temp1 + temp2 + 1 > 1 ? true : false);

				if (flag) {
					// �н�λ ������0 Ҳ������1
					result.append(temp1 + temp2 + 1 == 2 ? '0' : '1');
				} else {
					// �޽�λ ��Ҫ������һ�εĽ�λ1
					result.append('1');
				}

			} else {
				// ��һû�н�λ
				int temp1 = Integer.parseInt(bb1[bb1.length - i - 1] + "");
				int temp2 = Integer.parseInt(bb2[bb2.length - i - 1] + "");
				flag = (temp1 + temp2 > 1 ? true : false);
				if (flag) {
					// �н�λ
					result.append('0');
				} else {
					// �޽�λ
					int temp3 = (temp1 + temp2);
					result.append(temp3 == 0 ? '0' : '1');
				}
			}

		}
		// �Ƿ�������
		if (overflow && flag && bb1.length == bb2.length) {
			result.append('1');
		}
		return result.reverse().toString();
	}
   /**
    *  a simple test
    * @param args
    */
	public static void main(String[] args) {
		//String s= Long.toBinaryString(Long.parseLong("FF68", 16));
		////System.out.println("FF68 ת����binary:"+s);
		//getNativeNumber(s);
	//System.out.println(binaryAdd("111", "1", true));
	}
}
